package cn.kgc.controller;

import cn.kgc.dto.Dto;
import cn.kgc.dto.DtoUtil;
import cn.kgc.service.OrderService;
import cn.kgc.util.RedisUtil;
import cn.kgc.vo.CreateOrderVo;
import cn.kgc.vo.DmUserVo;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/api/v")
@Slf4j
public class OrderController {
    @Autowired
    RedisUtil redisUtil;

    @Autowired
    OrderService orderService;

    /**
     * 下单接口
     *
     * @param orderVo
     * @return
     * @throws Exception
     */
    @RequestMapping("/createOrder")
    public Long createOrder(@RequestBody CreateOrderVo orderVo ,HttpServletRequest request) throws Exception {
       /* String token = request.getHeader("token");
        DmUserVo vo = this.loadCurrentUserByTokenAsUserVo(token);
        orderVo.setUserId(vo.getUserId());
        return DtoUtil.returnDataSuccess(orderService.createOrder(orderVo));*/
        return  orderService.createOrder(orderVo);
    }

    public DmUserVo loadCurrentUserByTokenAsUserVo(String token) {
        String vo = (String) redisUtil.get(token);
        if (vo==null) {
            return null;
        }
        return JSONObject.parseObject(vo,DmUserVo.class);
    }


    //方法1.写个定时任务，扫描订单库中，超时未支付的订单，并且订单状态改成取消状态，座位重新释放
    // 10:10分的时候执行了一次查找超时订单，第10:11分钟执行，生成了一个订单（订单10:41份时候超时)
    //周期10:10，10:20,10.:30，10:48，10:50分的时候才会吧上面的订单超时释放，座位也是10:50分的时候超时释放，这个订单存活了39分?
    //解决办法:
    //1.后台容忍这个问题，前端时钟，前端做的，cookies ,前端js倒数，容忍这个问题，redis里面设置30分钟过期时间，查询redis查，30分钟后
    // 2.后台定时任务10分钟，2分钟,1分钟
    //最终一致性
    //对系统有一定的消耗，因为定时任务一直在后台执行
    @Scheduled(cron = "0 0/1 * * * ?")
    public void flushCancelOrder(){
        log.info("定时任务执行："+System.currentTimeMillis());
        //每10分钟看一下数据库有没有超时未支付的订单，订单需要取消支付，座位释放
        orderService.flushCancelOrder();
    }

    //方法2.可以使用RabbitNq的延迟队列，对超时未支付的订单做订单状态改成取消状态，座位重新释放 todo

}
